home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / Programming / Source / MathLink / MLExample_2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-19  |  4.3 KB  |  209 lines

  1. #import <stdio.h>
  2. #import "/LocalApps/Mathematica.app/Library/Mathematica/MathLink/Includes/mathlink.h"
  3.  
  4. #define DEBUG FALSE
  5.  
  6. void  error(MLINK);
  7. void  read_and_print_expression(MLINK);
  8. int   ReadPacket(MLINK);
  9.  
  10. void example_2(char *,double,double,double);
  11.  
  12. MLINK link;
  13.  
  14. main()
  15. {
  16.     char data[1000];
  17.     double min,max,del;
  18.  
  19.     link = MLStart("math -mathlink -batchoutput -noinit");
  20.  
  21.     strcpy(data,"{0 , 0 , .5 , 1 , 1 , 0}");
  22.     min = 0.0;
  23.     max = 1.0;
  24.     del = .1;
  25.     
  26.     example_2(data,min,max,del);
  27.     printf("%s\n",data);       
  28.  
  29.     MLClose(link);
  30. }
  31.  
  32. void example_2(stringdata,min,max,del)
  33. char *stringdata;
  34. double min,max,del;
  35. {    
  36.     char *rtn;
  37.     
  38.     MLClearError(link);
  39.     
  40.     MLPutFunction(link,"ToString",1);
  41.       MLPutFunction(link,"Chop",1);
  42.         MLPutFunction(link,"SetPrecision",2);
  43.           MLPutFunction(link,"Flatten",1);
  44.             MLPutFunction(link,"Table",2);
  45.               MLPutFunction(link,"List",2);
  46.             MLPutSymbol(link,"x");
  47.                 MLPutFunction(link,"MapAll",2);
  48.               MLPutFunction(link,"Interpolation",2);
  49.                 MLPutFunction(link,"Partition",2);
  50.                       MLPutFunction(link,"ToExpression",1);
  51.                     MLPutString(link,stringdata);
  52.                   MLPutInteger(link,2);
  53.                     MLPutFunction(link,"Rule",2);
  54.                   MLPutSymbol(link,"InterpolationOrder");
  55.                   MLPutInteger(link,1);
  56.                   MLPutSymbol(link,"x");
  57.               MLPutFunction(link,"List",4);
  58.                 MLPutSymbol(link,"x");
  59.             MLPutReal(link,min);
  60.             MLPutReal(link,max);
  61.             MLPutReal(link,del);
  62.           MLPutInteger(link,3);
  63.     MLEndPacket(link);
  64.  
  65.     if (DEBUG)
  66.     {
  67.       read_and_print_expression(link);
  68.       return;
  69.     }    
  70.  
  71.     while (MLNextPacket(link) != RETURNPKT)
  72.     {
  73.        if (MLError(link))
  74.           return;
  75.        MLNewPacket(link);
  76.     }
  77.     
  78.     MLGetNext(link);
  79.     MLGetString(link,&rtn);
  80.     strcpy(stringdata,rtn);
  81. }  
  82.  
  83. void  error( mlp) MLINK mlp;
  84. {
  85.     fprintf( stderr, "\nerror: %s\n", MLErrorMessage( mlp));
  86.     MLClose( mlp);
  87.     exit( 0);
  88. }  /* error */
  89.  
  90. void  read_and_print_expression( p) MLINK p;
  91. {
  92.     char  *s;
  93.     int    n, i, len;
  94.     double r;
  95.     static int indent;
  96.     
  97.     i=MLGetNext(p);
  98.     fprintf(stderr, "Packet type = %d\n",i);
  99.     
  100.     switch (i) {    
  101.     case MLTKSYM:
  102.         MLGetSymbol( p, &s);
  103.         fprintf( stderr, "%s ", s);
  104.         break;
  105.     case MLTKSTR:
  106.         MLGetString( p, &s);
  107.         fprintf( stderr, "\"%s\" ", s);
  108.         break;
  109.     case MLTKINT:
  110.         MLGetInteger( p, &n);
  111.         fprintf( stderr, "%d ", n);
  112.         break;
  113.     case MLTKREAL:
  114.         MLGetReal( p, &r);
  115.         fprintf( stderr, "%f ", r);
  116.         break;
  117.     case MLTKFUNC:
  118.         indent += 3;
  119.         fprintf( stderr, "\n %*.*s", indent, indent, "");
  120.         if (MLGetArgCount( p, &len) == 0) {
  121.             error( p);
  122.         }else{
  123.             read_and_print_expression(p);
  124.             fprintf( stderr, "[");
  125.             for (i = 1; i <= len; ++i) {
  126.                 read_and_print_expression(p);
  127.                 if (i != len) fprintf( stderr, ", ");
  128.             }
  129.             fprintf( stderr, "]");
  130.         }
  131.         indent -= 3;
  132.         break;
  133.     case MLTKERROR:
  134.     default:
  135.         error( p);
  136.     }
  137. }  /* read_and_print_expression */
  138.  
  139.  
  140. int   ReadPacket( mlp)  MLINK mlp;
  141. {    int code;
  142.     int len = 1;
  143.  
  144.     switch (code = MLNextPacket(mlp)) {
  145.     case INPUTPKT:
  146.         fprintf( stderr, "<INPUTPKT>");
  147.         break;
  148.     case OUTPUTPKT:
  149.         fprintf( stderr, "<OUTPUTPKT>");
  150.         break;
  151.     case TEXTPKT:
  152.         if (DEBUG) fprintf( stderr, "<TEXTPKT>");
  153.         break;
  154.     case RETURNPKT:
  155.         fprintf( stderr, "Result (expression):");
  156.         break;
  157.     case RETURNTEXTPKT:
  158.         fprintf( stderr, "=");
  159.         break;
  160.     case MESSAGEPKT:
  161.         len = 2;
  162.         fprintf( stderr, "\nMessage packet:");
  163.         break;
  164.     case CALLPKT:
  165.         fprintf( stderr, "<CALLPKT>");
  166.         break;
  167.     case INPUTNAMEPKT:
  168.         fprintf( stderr, "\n");
  169.         break;
  170.     case OUTPUTNAMEPKT:
  171.         if (DEBUG) fprintf( stderr, "<OUTPUTNAMEPKT>");
  172.         break;   
  173.     case CONTROLPKT:
  174.         fprintf( stderr, "<CONTROLPKT>");
  175.         break;   
  176.     case SYNTAXPKT:
  177.         fprintf( stderr, "<SYNTAXERROR>");
  178.         break;   
  179.     default:
  180.         fprintf( stderr, "unknown packet \"%d\"\n", code);
  181.         return 0;
  182.     }
  183.     while (len --) {
  184.         read_and_print_expression( mlp);
  185.     }
  186.     if ((code != INPUTNAMEPKT) && (code != OUTPUTNAMEPKT)) {
  187.         fprintf( stderr, "\n");
  188.     }
  189.     return code;
  190. }  /* ReadPacket */
  191.  
  192. /*******************************************/
  193. /* Search for string t in string s         */
  194. /* Return position if found, otherwise -1  */
  195. /*******************************************/
  196. int instr(s,t)
  197. char *s,*t;
  198. {
  199.      int i,j,k;
  200.      
  201.      for (i=0 ; s[i] && t[0] ; i++)
  202.      {
  203.          for (j=i , k=0 ; t[k] && s[j] == t[k] ; j++ , k++);
  204.         if (!t[k]) 
  205.            return(i);
  206.      }
  207.      return(-1);
  208. }
  209.